www.gusucode.com > VC++ 基于IE内核功能很齐全的浏览器(支持多标签)-源码程序 > VC++ 基于IE内核功能很齐全的浏览器(支持多标签)-源码程序/code/Explorer/CJFrameWnd.cpp
// CJFrameWnd.cpp : implementation file // Copyright ? 1998-1999 CodeJock.com, All Rights Reserved. // See ReadMe.txt for TERMS OF USE. // ///////////////////////////////////////////////////////////////////////////// /**************************************************************************** * * $Date: 10/31/99 11:04p $ * $Revision: 16 $ * $Archive: /CodeJock/CJLibrary/CJFrameWnd.cpp $ * * $History: CJFrameWnd.cpp $ * * ***************** Version 16 ***************** * User: Kirk Stowell Date: 10/31/99 Time: 11:04p * Updated in $/CodeJock/CJLibrary * Minor update to PreCreateWindow(...) for flicker free drawing. * * ***************** Version 15 ***************** * User: Kirk Stowell Date: 10/29/99 Time: 12:43a * Updated in $/CodeJock/CJLibrary * Overloaded PreCreateWindow(...) for flicker free drawing. * * ***************** Version 14 ***************** * User: Kirk Stowell Date: 10/14/99 Time: 6:15p * Updated in $/CodeJock/CJLibrary * Fixed bug with a document becomes the active document when the user * clicks inside a tab in the CCJTabControlBar to perform some operation. * When closing the application, MFC decides in CFrameWnd::OnClose() to * check if the 'active' document is modified before checking all other * documuents. If the active document is not modified and can close its * frame, it does not check other documents individually and shuts down * without asking the important 'modified save' questions. To fix this, * OnClose() was overriden to add a call to "SetActiveView(NULL)" just * before the base class OnClose is called. This will check all documents * asking the save question before closing the application. Thanks to * Simon Clark [spc@otleda.com] for help with this. * * ***************** Version 13 ***************** * User: Kirk Stowell Date: 10/14/99 Time: 10:05a * Updated in $/CodeJock/CJLibrary * Overrode OnEraseBkgnd(...) to help to eliminate screen flicker. * * ***************** Version 12 ***************** * User: Kirk Stowell Date: 9/16/99 Time: 2:35p * Updated in $/CodeJockey/CJLibrary * Fixed bug with save / restore bar state, and with saved bar size * changing whenever the application starts. * * ***************** Version 11 ***************** * User: Kirk Stowell Date: 8/31/99 Time: 1:11a * Updated in $/CodeJockey/CJLibrary * Updated copyright and contact information. * * ***************** Version 10 ***************** * User: Kirk Stowell Date: 7/25/99 Time: 12:30a * Updated in $/CodeJockey/CJLibrary * * ***************** Version 9 ***************** * User: Kirk Stowell Date: 6/23/99 Time: 12:33a * Updated in $/CodeJockey/CJLibrary * * ***************** Version 8 ***************** * User: Kirk Stowell Date: 6/11/99 Time: 8:25p * Updated in $/CodeJockey/CJ60Lib * Slight modification made to popup menu code. * * ***************** Version 7 ***************** * User: Kirk Stowell Date: 6/09/99 Time: 8:33p * Updated in $/CodeJockey/CJ60Lib * Ioannhs Stamatopoulos (Yiannhs) [ystamat@mail.datamedia.gr] - Extended * docking windows, removed ::GetSysColor(...) calls and WM_SYSCOLORCHANGE * message handler, this is now automatically handled by the base class. * Added redraw flags to the create method and modified paint and layout * handlers to reduce flicker and un-necessary command handling. Dragging * rect now reflects actual control bar docked size. Added "flat" look to * the control bars, the control bars can now use the classic DevStudio * look, or use flat gradient gripper, borders and frame buttons. Overall, * docking windows now handle dragging, docking and floating much better, * and behave more like DevStudio. * * ***************** Version 6 ***************** * User: Kirk Stowell Date: 5/02/99 Time: 5:23p * Updated in $/CodeJockey/CJ60Lib * Further modifications for CCJMenu support. * * ***************** Version 5 ***************** * User: Kirk Stowell Date: 5/02/99 Time: 2:18a * Updated in $/CodeJockey/CJ60Lib * * ***************** Version 4 ***************** * User: Kirk Stowell Date: 5/02/99 Time: 2:13a * Updated in $/CodeJockey/CJ60Lib * Re-wrote CCJMenu initialization routines with a more cleaner approach. * * ***************** Version 3 ***************** * User: Kirk Stowell Date: 4/03/99 Time: 4:47p * Updated in $/CodeJockey/CJ60Lib * Added comments and cleaned up code. Added support for Brent Corkum's * BCMenu (CCJMenu), which is a replacement for the CCoolMenu class. * * ***************** Version 2 ***************** * User: Kirk Stowell Date: 1/12/99 Time: 4:46p * Updated in $/CodeJockey/CJ60Lib * Total re-write to add side-by-side docking support for CCJControlBar * class. * * ***************** Version 1 ***************** * User: Kirk Stowell Date: 10/17/98 Time: 4:46p * Created in $/CodeJockey/CJ60Lib * Initial re-write and release. * ***************************************************************************/ ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "CJFrameWnd.h" //#include "CJDockBar.h" //#include "CJSizeDockBar.h" //#include "CJControlBar.h" //#include "CJMiniDockFrameWnd.h" #include "CJToolBar.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCJFrameWnd CCJFrameWnd::CCJFrameWnd() { } CCJFrameWnd::~CCJFrameWnd() { } IMPLEMENT_DYNCREATE(CCJFrameWnd, CFrameWnd) BEGIN_MESSAGE_MAP(CCJFrameWnd, CFrameWnd) //{{AFX_MSG_MAP(CCJFrameWnd) ON_WM_MEASUREITEM() ON_WM_MENUCHAR() ON_WM_INITMENUPOPUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCJFrameWnd message handlers // dwDockBarMap DWORD CCJFrameWnd::dwDockBarMap[4][2] = { { AFX_IDW_DOCKBAR_TOP, CBRS_TOP }, { AFX_IDW_DOCKBAR_BOTTOM, CBRS_BOTTOM }, { AFX_IDW_DOCKBAR_LEFT, CBRS_LEFT }, { AFX_IDW_DOCKBAR_RIGHT, CBRS_RIGHT }, }; HMENU CCJFrameWnd::NewMenu(UINT nMenuID, UINT nToolbarID) { // Load the menu and toolbar resource. m_menu.LoadMenu(nMenuID); if (nToolbarID) { m_menu.LoadToolbar(nToolbarID); } // Detach the menu. return(m_menu.Detach()); } HMENU CCJFrameWnd::NewMenu(UINT nMenuID, UINT* nToolbarIDs, int nSize) { // Load the menu and toolbar resources. m_menu.LoadMenu(nMenuID); if (nToolbarIDs) { m_menu.LoadToolbars(nToolbarIDs, nSize); } // Detach the menu. return(m_menu.Detach()); } BOOL CCJFrameWnd::InitializeMenu(UINT nMenuID, UINT nToolBarID/*=NULL*/) { ASSERT(nMenuID); // must be valid. // Get a pointer to the existing menu, and destroy it. CMenu* pMenu = GetMenu(); ASSERT_VALID(pMenu); pMenu->DestroyMenu(); // Set the default menu with the newly created Menu. m_hMenuDefault = NewMenu(nMenuID, nToolBarID); SetMenu(CMenu::FromHandle(m_hMenuDefault)); return TRUE; } BOOL CCJFrameWnd::InitializeMenu(UINT nMenuID, UINT* nToolbarIDs/*=NULL*/, int nSize/*=NULL*/) { ASSERT(nMenuID); // must be valid. // Get a pointer to the existing menu, and destroy it. CMenu* pMenu = GetMenu(); ASSERT_VALID(pMenu); pMenu->DestroyMenu(); // Set the default menu with the newly created Menu. m_hMenuDefault = NewMenu(nMenuID, nToolbarIDs, nSize); SetMenu(CMenu::FromHandle(m_hMenuDefault)); return TRUE; } void CCJFrameWnd::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { if (lpMeasureItemStruct->CtlType == ODT_MENU) { if (IsMenu((HMENU)lpMeasureItemStruct->itemID)) { CMenu* pMenu = CMenu::FromHandle((HMENU)lpMeasureItemStruct->itemID); if(m_menu.IsMenu(pMenu)) { m_menu.MeasureItem(lpMeasureItemStruct); return; } } } CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } LRESULT CCJFrameWnd::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) { if(m_menu.IsMenu(pMenu)) { return CCJMenu::FindKeyboardShortcut(nChar, nFlags, pMenu); } return CFrameWnd::OnMenuChar(nChar, nFlags, pMenu); } void CCJFrameWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); if(!bSysMenu) { if(m_menu.IsMenu(pPopupMenu)) { CCJMenu::UpdateMenu(pPopupMenu); } } } BOOL CCJFrameWnd::PreTranslateMessage(MSG* pMsg) { if( m_wndMenuBar.GetSafeHwnd()) { if( m_wndMenuBar.TranslateFrameMessage(pMsg)) { return TRUE; } } return CFrameWnd::PreTranslateMessage(pMsg); } // Default implementation. BOOL CCJFrameWnd::PreCreateWindow(CREATESTRUCT& cs) { return CFrameWnd::PreCreateWindow(cs); } //////////////// // Overloaded for flicker-free drawing with no CS_VREDRAW and CS_HREDRAW. // Override in CMainFrame and call this method, rather than the default. Pass // in your apps icon resource usually IDR_MAINFRAME. // BOOL CCJFrameWnd::PreCreateWindow(CREATESTRUCT& cs, UINT nIconID) { // Register wnd class with no redraw, cursor (use default), background // brush and load your apps icon resource. cs.lpszClass = AfxRegisterWndClass( 0, NULL, NULL, AfxGetApp()->LoadIcon(nIconID)); ASSERT(cs.lpszClass); return CFrameWnd::PreCreateWindow(cs); }